package criterios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import baseDeDatos.GestorBD;
import datosFamilias.*;

public class CriterioAnciano extends CriterioAbstracto
{ 
    String consultaAncianos;
    
    public CriterioAnciano(GestorBD base)
    {
        baseDeDatos = base;
        cargarConsulta();
    }

    private void cargarConsulta()
    {
        consultaAncianos = "SELECT e.id, e.name, e.surname, YEAR( CURDATE( ) ) - YEAR( e.borndate ) + IF( DATE_FORMAT( CURDATE( ) , '%m-%d' ) > DATE_FORMAT( e.borndate, '%m-%d' ) , 0, -1 ), e.direction_id "
                         + "FROM people e "
                         + "WHERE ((CAST( e.borndate AS DATETIME )) < ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 65 YEAR ) )) ";
    }

    @Override
    public void ejecutarConsultas(ArrayList<Familia> familias, int criterio) 
    {
         try 
         {
            // Realizamos la consulta
            ResultSet resultadosAncianos = baseDeDatos.consultar(consultaAncianos);
            
            // Mientras haya tuplas resultado
            while(resultadosAncianos.next())
            {
                String direccionAnc = resultadosAncianos.getString(5);
                int index = 0;
                
                // Buscamos la familia correspondiente al anciano de acuerdo a la direccion
                while(index < familias.size() && !direccionAnc.equals(familias.get(index).obtenerDireccion()))
                {
                    index++;
                }
                
                Familia f = familias.get(index);
                Persona persAnc = null;
                
                // Verificamos si la persona fue creada, en caso de que exista la obtenemos, caso contrario, la creamos.
                if(f.existeIntegrante(resultadosAncianos.getInt(1)))
                {
                    persAnc = f.obtenerIntegrante(resultadosAncianos.getInt(1));
                }
                else
                {
                    persAnc = new Persona(resultadosAncianos.getInt(1), resultadosAncianos.getString(2)+" "+resultadosAncianos.getString(3), resultadosAncianos.getInt(4), direccionAnc);
                    f.agregarIntegrante(persAnc);
                }
                
                // Agregamos que la persona es anciana
                persAnc.agregarDato("anciano", criterio);
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(CriterioAnciano.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}